package com.wang.common.http;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONException;

import com.wang.common.types.AbstractParser;

import android.os.AsyncTask;
import android.util.Log;


/**
 * 三个泛型：　Param ，任务执行器需要的数据类型 　　Progress 后台计算中使用的进度单位数据类型 　　Result
 * 后台计算返回结果的数据类型 　　有些参数是可以设置为不使用的，只要传递为Void型即可，比如AsyncTask 　　四个步骤：
 * 　　onPreExecute()，执行预处理，它运行于UI线程，可以为后台任务做一些准备工作，比如绘制一个进度条控件。
 * 　　doInBackground(Params...)，后台进程执行的具体计算在这里实现，doInBackground(Params...)
 * 是AsyncTask的关键，此方法必须重载。在这个方法内可以使用 publishProgress(Progress...)改变当前的进度值。
 * 　　onProgressUpdate(Progress...)，运行于UI线程。如果在doInBackground(Params...)
 * 中使用了publishProgress(Progress...)，就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。
 * 　　onPostExecute
 * (Result)，运行于UI线程，可以对后台任务的结果做出处理，结果就是doInBackground(Params...)
 * 的返回值。此方法也要经常重载，如果Result为null表明后台任务没有完成(被取消或者出现异常)。
 * 
 * @author wangzy
 */

public class HttpRequesterTask<T> extends AsyncTask<String,Integer,String> {
   
	private String tag="HttpRequesterTask";
	private HttpCallBack<T> httpCallback;
	private AbstractParser<T> absParser;
	public HttpRequesterTask(HttpCallBack<T> httpCallback,AbstractParser<T> absParser) {
		this.httpCallback=httpCallback;
		this.absParser=absParser;
	}
	@Override
	protected void onPreExecute() {
		// 预处理
		httpCallback.OnStart();
		super.onPreExecute();
	}

	@Override
	protected String doInBackground(String... param) {
		// 后台计算
		httpCallback.onDoing();
		String host = param[0];
		String ret="";
		try {
			ret=HttpTool.requestUrl(host);
		} catch (Exception e){
			this.httpCallback.OnException(e);
			Log.e(tag, "request exception");
			e.printStackTrace();
			cancel(isCancelled());
		}
		// publishProgress(10);
		return ret;
	}

	@Override
	protected void onProgressUpdate(Integer... values) {
		super.onProgressUpdate(values);
		/*
		 * 运行于UI线程。如果在doInBackground(Params...)
		 * 中使用了publishProgress(Progress...)，
		 * doInBackground方法在做完任务的时候才会有返回结果，所以需要调用publishrogress方法去通知更新UI线程
		 */
		Log.i(tag, "receive progress:" + values[0]);
	}

	@Override
	protected void onPostExecute(String result) {
		// 处理结果
		super.onPostExecute(result);
		
		List<T> alist;
		try {
			alist = absParser.parseArrayListFromJsonStr(result);
			this.httpCallback.OnComplete(alist);
		} catch (JSONException e) {
			e.printStackTrace();
		}
	
		Log.i(tag, result);
		
	}

};
